|
| |||||||||||
| ||||||||||||
Perl 语言全面编译(四)天水-S.Tanshuai |
| 第四节 PerlCC之Bytecode 编译解析法 |
| Bytecode 是 PerlCC的另一编译方法,必须在Perl5.6以后版本才有得支持。它的原理就好像Java一样,它会把Perl文件编译成二进制令人费解的乱码文件,它是采用类似MD5这样的反向加密编码,几乎不可能反编译,和可执行程序一样复杂,但是它不可以直接执行哦。想要执行它,必须用Perl解析器,就好像 Java 编译后必须有Java解析器,否则就无法执行。我习惯成为编译解析法,有的时候就说Just Like Java Progam! |
| 它的编译方法也不难,但是竟然有很多人都不知道,我问过很多Perl前辈,他们也不大了解这一方法。而且很多我也从来见过谁写过这样的程序(难道我是国内第一个知道的吗?:) |
| 使用方法:perlcc –b <程序名> |
| 编译后它会输出一个<程序名.plc>文件,你打开它看,定会吃惊。而且这种文件最小是180KB,比perlcc C语言转换编译多了很多。 |
| 它的好处在于,一处编译到处使用。但是对于CGI就不大好处理。所以还是建议在各个平台进行编译。 |
| 例如我ByteCode编译上节的abc.pl程序文件: |
| 输入: |
| perlcc –b abc.pl |
| Perlcc –B 输出 |
| ---------------------------------------------------------------------------- |
| Compiling abc.pl: |
| ---------------------------------------------------------------------------- |
| Making Bytecode(abc.plc) for abc.pl! |
| C:\perl\5.6.0\bin\MSWin32-x86\perl.exe -IC:/perl/5.6.0/lib/MSWin32-x86 -IC:/perl |
| /5.6.0/lib -IC:/perl/site/5.6.0/lib/MSWin32-x86 -IC:/perl/site/5.6.0/lib -I. -MB |
| ::Stash -c abc.pl |
| C:\perl\5.6.0\bin\MSWin32-x86\perl.exe -IC:/perl/5.6.0/lib/MSWin32-x86 -IC:/perl |
| /5.6.0/lib -IC:/perl/site/5.6.0/lib/MSWin32-x86 -IC:/perl/site/5.6.0/lib -I. -MO |
| =Bytecode,-umain,-uattributes,-uDB,-uWin32 abc.pl |
| abc.pl syntax OK |
| 好了,然后perl abc.plc 就可以执行了。 |
| 执行注意事项: |
| 使用Bytecode 编译后的文件,你一般需要更名回原来的文件名,否则容易在运行程序后出现警告信息“Attempt to free unreferenced scalar.”虽然它对程序没有本质影响,但是不美观嘛,另一种解决方法就是使用 perl –X ,关闭所有警告消息,警告不等同与错误,所以一般情况下,某些警告是不必要的。 |
| 同样ByteCode 编译程序可以被引用(require)但是不能调用(use),可以作为对象编程的对象。这是一个很灵活的东西,如果你希望你的模块被大家使用,但是不想让大家知道其中的操作,那么你就是用ByteCode,但是你的模块将永远不会被纳入CPAN。这种方法就好像OCX控件。 |
| 但是注意,但是使用某个模块的时候,你必须保证使用该程序的机器上有这个模块,最简单的方法你可以把模块一起复制使用,但是有些第三方程序模块需要重新编译,你如果不希望其它人操作模块或者是看到引用的模块,也可以使用Bytecode。但是注意,一定要用require方法调用加密模块啊。这个世界总是这样,总会有些遗憾的,这样的话就不能用一些模块和OOP。 |
| 不知道你了解Python这个语言否?它Perl很相像,比Perl还有简单呢。但是我认为很多东西都是抄Perl的,包括它得二进制编译方法,就和Perl Bytecode没有任何区别。反正大家也都知道PHP也是抄了Perl不少东西。 |
| (网页编辑:徐向阳) |
| 相关文章 |
| [关闭窗口] |
Copyright(C) ccw.com.cn,All rights reserved
中国计算机世界出版服务公司版权所有